/**
 * Created by wenwang on 2017/8/31.
 */

export function getType(o) {
  var _t;
  return ((_t = typeof(o)) == "object" ? o == null && "null" || Object.prototype.toString.call(o).slice(8, -1) : _t).toLowerCase();
}

export function type(obj) {
  return getType(obj)
}

export function isFunction(value) {
  return type(value) == "function"
}

export function isWindow(obj) {
  return obj != null && obj == obj.window
}

export function isDocument(obj) {
  return obj != null && obj.nodeType == obj.DOCUMENT_NODE
}

export function isObject(obj) {
  return type(obj) == "object"
}

export function isPlainObject(obj) {
  return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype
}

export const isArray = Array.isArray ||
  function(object) {
    return object instanceof Array
  }

export const isJson = (obj) => {
  const isjson = typeof (obj) === 'object' && Object.prototype.toString.call(obj).toLowerCase() === '[object object]' && !obj.length
  return isjson
}

export const extend = function() {
  // 定义默认参数和变量
  // 对象分为扩展对象和被扩展的对象
  //options 代表扩展的对象中的方法
  //name 代表扩展对象的方法名
  //i 为扩展对象参数起始值
  //deep 默认为浅复制
  var options, name, src, copy, copyIsArray, clone,
    target = arguments[0] || {},
    i = 1,
    length = arguments.length,
    deep = false;
  //当第一个参数为布尔类型是，此参数定义是否为深拷贝
  //对接下来的参数进行处理
  if (typeof target === "boolean") {
    deep = target;
    target = arguments[1] || {};
    // 当定义是否深拷贝时，参数往后移动一位
    i = 2;
  }
  // 如果要扩展的不是对象或者函数，则定义要扩展的对象为空
  if (typeof target !== "object" && !isFunction(target)) {
    target = {};
  }
  if (length === i) {
    target = this;
    --i;
  }
  //对从i开始的多个参数进行遍历
  for (; i < length; i++) {
    // 只处理有定义的值
    if ((options = arguments[i]) != null) {
      // 展开扩展对象
      for (name in options) {
        src = target[name];
        copy = options[name];
        // 防止循环引用
        if (target === copy) {
          continue;
        }
        // 递归处理深拷贝
        if (deep && copy &&
          (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
          if (copyIsArray) {
            copyIsArray = false;
            clone = src && isArray(src) ? src : [];
          } else {
            clone = src && isPlainObject(src) ? src : {};
          }
          target[name] = extend(deep, clone, copy);
          // 不处理未定义值
        } else if (copy !== undefined) {
          //给target增加属性或方法
          target[name] = copy;
        }
      }
    }
  }
  //返回
  return target;
};
